package com.ys.day29.Reflect.p5Reflect与Method对象;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;

/**
 * 描述:
 *  // 加了Declared 就是获得本类的所有的 ....方法,属性,,
 *  * // 没有Declared 就是获得本类+父类 被 public修饰的 方法,属性
 * <p>
 * * 场景：根据名称获取某一个方法签名
 * * 步骤：
 * * 1 反射入口获取ArrayList的Class对象
 * * 2 调用Class对象的getDeclaredMethod(String, Class<?>... parameterTypes)方法，根据名称获取对应的方法签名
 * * 3 打印方法签名信息
 * * 4 获取方法的访问修饰符、返回类型、方法名称、参数信息
 *
 * @author CodeYang
 * @version 2021/1/11 20:26
 */
public class P2获取Class指定的Method签名信息 {

    public static void main(String[] args) {
        try {

            Class<ArrayList> aClass = ArrayList.class;
            Class<?>[] param = {int.class, Object.class};
            // 这里 通过指定名称去获取Method签名
            // getDeclaredMethod  参数1:名称: add 产生2: Class<?>... parameterTypes可变产生列表 可以0-n个 参选列表类型 int.class ,Object.class
            // 侧面证明了 方法的重载是根据 类型来确定的(本质是根据Class对象)
            Method method = aClass.getDeclaredMethod("add", param);
            // public void java.util.ArrayList.add(int,java.lang.Object)
            System.out.println(method);

            // 2 获得Method对象的(获得方法) 修饰符
            int modifiers = method.getModifiers();

            System.out.println(Modifier.toString(modifiers));

            //3 获得方法的返回类型
            Class<?> returnType = method.getReturnType();
            System.out.println(returnType);

            //4 获得返回类型的类型名称
            String simpleName = returnType.getSimpleName();
            System.out.println(simpleName);

            //5 获取方法的名称
            String methodName = method.getName();
            System.out.println(methodName);

            //6 获取方法的参数列表 一个方法可能有多个参数所以此时返回一个Parameter数组
            //int arg0
            //E arg1
            Parameter[] parameters = method.getParameters();
            for (Parameter parameter : parameters) {
                System.out.println(parameter);
            }


        } catch (NoSuchMethodException e) {


        }
    }
}
